#include "realtimepos.h"
#include "rtk.h"

//构造函数
RealTimePos::RealTimePos()
{
    int i=0;
    //rtk结构体初始化
    rtkinit(&rtk,&prcopt_default);
    //nav结构体开辟空间并初始化
    eph_t eph0 ={0,-1,-1};
    if (!(nav.eph = (eph_t *)malloc(sizeof(eph_t)*MAXSAT*2))) return;
    for (i=0;i<MAXSAT *2;i++) nav.eph[i]=eph0;
    nav.n = MAXSAT *2;
}

//设置配置参数
void RealTimePos::SetOpt(prcopt_t opt)
{
    int i=0;
    //将prcopt配置参数赋值给rtk结构体
    rtkinit(&rtk,&opt);
    for (i=0;i<6;i++)
    {
        rtk.rb[i]=i<3?opt.rb[i]:0.0;
    }
    for (i=0;i<3;i++)
    {
        rtk.sol.ru[i]=i<3?opt.ru[i]:0.0;
    }
    strcpy(rtk.sol.name,opt.rovname);
}

//开始定位解算（区分基准站和流动站）
void RealTimePos::StartPos(obs_t obs_r,obs_t obs_b)
{
    int i=0;
    obs_t obs;  //观测值结构体
    obsd_t data[MAXOBS*2];

    //1、为观测值开辟空间
    obs.n=0;
    obs.data=data;

    //2、将流动站观测值和基准站观测值整合到一起
    for(i=0;i<obs_r.n&&obs.n<MAXOBS*2;i++)
    {
        obs_r.data[i].rcv = 1;//流动站
        obs.data[obs.n++] = obs_r.data[i];  //流动站观测值
    }
    for(i=0;i<obs_b.n&&obs.n<MAXOBS*2;i++)
    {
        obs_b.data[i].rcv = 2;//基准站
        obs.data[obs.n++] = obs_b.data[i];  //基准站观测值
    }

    //3、RTK定位
    rtkpos(&rtk,obs.data,obs.n,&nav);//主要定位函数

    return;
}

void RealTimePos::GetPos(sol_t sol)
{
    sol = rtk.sol;
}

void RealTimePos::StartSPP(obs_t obs)
{

}

